package org.jeecg.modules.easyExcel;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;

import javax.annotation.Nonnull;
import java.util.stream.Stream;

public class SheetProcesser {

    static Sheet lastSheet;
    static Drawing<?> lastDrawing;


    /**
     * 在指定Sheet的指定行列创建批注
     * @param sheet 要创建批注的sheet
     * @param comment 批注内容
     * @param row 创建批注的行
     * @param column 创建批注的列
     * @param height 批注高度
     * @param width 批注宽度
     */
    public static void createComment(@Nonnull Sheet sheet, String comment, int row, int column, int height, int width) {
        // 如果sheet有变化，则记录变化，并重新获取drawing，否则直接使用之前的drawing
        if (lastSheet != sheet) {
            lastSheet = sheet;
            lastDrawing = sheet.getDrawingPatriarch();
        }
        if (lastDrawing == null)
            lastDrawing = sheet.createDrawingPatriarch();
        // 创建批注
        Comment commentObj = lastDrawing.createCellComment(new XSSFClientAnchor(10, 10, 10, 10, column, row, column + width, row + height));
        commentObj.setString(new XSSFRichTextString(comment));
        sheet.getRow(row).getCell(column).setCellComment(commentObj);
    }

    /**
     * 为指定的单元格范围添加验证规则。
     *
     * @param firstRow 验证范围的起始行。
     * @param lastRow 验证范围的结束行。
     * @param firstCol 验证范围的起始列。
     * @param lastCol 验证范围的结束列。
     * @param listOfValues 允许的值的集合。
     * @param emptyCellAllowed 是否允许单元格为空。
     * @param showErrBox 是否在验证失败时显示错误提示框。
     * @param errBoxTitle 错误提示框的标题。
     * @param errBoxText 错误提示框显示的文本。
     */
    public static void addValidation(@Nonnull Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol, Stream<String> listOfValues, boolean emptyCellAllowed, boolean showErrBox, String errBoxTitle, String errBoxText) {
        // 设置数据验证的范围
        CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
        // 获取数据验证帮助器
        DataValidationHelper helper = sheet.getDataValidationHelper();
        // 创建一个明确的列表约束
        DataValidationConstraint constraint = helper.createExplicitListConstraint(listOfValues.toArray(String[]::new));
        // 根据约束和范围创建数据验证对象
        DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
        // 设置不允许空单元格
        dataValidation.setEmptyCellAllowed(emptyCellAllowed);
        // 设置显示错误提示框
        dataValidation.setShowErrorBox(showErrBox);
        // 创建错误提示框
        dataValidation.createErrorBox(errBoxTitle, errBoxText);
        // 将数据验证对象添加到Sheet中
        sheet.addValidationData(dataValidation);
    }
}
